<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    数组扁平化: 取出嵌套数组(多维)中的所有元素放到一个新数组(一维)中
      如: [1, [3, [2, 4]]]  ==>  [1, 3, 2, 4]

      [1, [2, 3], [4, [5, [6, 7]]]]
    */
    const arr = [1, [2, 3], [4, [5, [6, 7]]]]
    // const arr = [4, [5, 6]]


    /*
    方法一: 递归 + reduce() + concat() + some()
    [4, [5, 6]]  ==> [4, 5, [6, 7]]
    [4, 5, 6]
    */
    function flatten(arr) {
      return arr.reduce((pre, item) => {
        // 如果item是一个二维数组, 需要先将其转换为一维数组
        // 如何判断一个二维数组 ==> 只要有一个元素是数组
        if (Array.isArray(item) && item.some(cItem => Array.isArray(cItem))) {
          // 递归调用给item降低一个维度, 再与pre合并
          return pre.concat(flatten(item))
        }
        // 如果item不是二维数组 ==> 直接concat就可以了
        return pre.concat(item)
      }, [])  // []=> [4].concat([5, [6, 7]])  => [4, 5, [6, 7]]
    }
    console.log(flatten(arr))

    /*
    方法二: ... + some() + concat()
    [1, [2, 3], [4, [5, [6, 7]]]]
    */
   function flatten2(arr) {
      // 只要arr是一个多维数组(有元素是数组)
      while(arr.some(item => Array.isArray(item))) {
        // 对arr进行降维
        arr = [].concat(...arr)
      }
      return arr
   }
   console.log(flatten2(arr))

  // [4, [5, 6]]  => [].concat(4, [5, 6])  ==> [4, 5, 6]
  
  </script>
</body>
</html>